This is an R Markdown Notebook. When you execute code within the notebook, the results appear beneath the code.

Try executing this chunk by clicking the Run button within the chunk or by placing your cursor inside it and pressing Ctrl+Shift+Enter.

<<<<<<< HEAD
pushIndicatorGraph(fig, 395)
Loading required package: rjson
Loading required package: httr

Attaching package: 㤼㸱httr㤼㸲

The following object is masked from 㤼㸱package:plotly㤼㸲:

    config

Error in pushAplansData(body, "indicator_graph/") : 
  Bad Request (HTTP 400).
=======

tmp <- dat[dat$date>=max(dat$date)-20,]
tmp <- aggregate(tmp$new, by=tmp[c("area")], FUN=function(x) sum(x, na.rm=TRUE))
fig <- plot_ly() %>%
   add_trace(
    type="choropleth",
    geojson=geojson,
    locations=tmp$area,
    z=tmp$x,
    zmin=0,
    zmax=30,
    colorscale="Viridis",
    featureidkey="properties.Name"
  ) %>%
  layout(
    geo = g
  )
fig
>>>>>>> b4e35ca95f79ed74fb448ccd1682fc683b84c0d2

### Kartta kaikista raportoiduista tapauksista

tmp <- dat[dat$date==max(dat$date),]
fig <- plot_ly() %>%
   add_trace(
    type="choropleth",
    geojson=geojson,
    locations=tmp$area,
    z=tmp$cumulative,
    zmin=0,
    zmax=50,
    colorscale="Viridis",
    featureidkey="properties.Name"
  ) %>%
  layout(
    geo = g
  )
fig

############################################

url <- 'https://raw.githubusercontent.com/plotly/datasets/master/geojson-counties-fips.json'
counties <- rjson::fromJSON(file=url)
url2<- "https://raw.githubusercontent.com/plotly/datasets/master/fips-unemp-16.csv"
df <- read.csv(url2, colClasses=c(fips="character"))
g <- list(
  scope = 'usa',
  projection = list(type = 'albers usa'),
  showlakes = TRUE,
  lakecolor = toRGB('white')
)
fig <- plot_ly()
fig <- fig %>% add_trace(
    type="choropleth",
    geojson=counties,
    locations=df$fips,
    z=df$unemp,
    colorscale="Viridis",
    zmin=0,
    zmax=12,
    marker=list(line=list(
      width=0)
    )
  )
fig <- fig %>% colorbar(title = "Unemployment Rate (%)")
fig <- fig %>% layout(
    title = "2016 US Unemployment by County"
)

fig <- fig %>% layout(
    geo = g
  )

fig

#################################################

shp <- substr(meta[grep("SHP",meta)-1],8,13)
day <- substr(meta[grep(':"week"',meta)-2],8,13)

l1 <- "https://sampo.thl.fi/pivot/prod/fi/epirapo/covid19case/fact_epirapo_covid19case.csv?row=dateweek2020010120201231-"
l1j <- "https://sampo.thl.fi/pivot/prod/fi/epirapo/covid19case/fact_epirapo_covid19case.json?row=dateweek2020010120201231-"
l2 <- "&row=hcdmunicipality2020-"
l3 <- "&column=measure-141082"

out <- data.frame()
for(i in shp) {
   for(j in day) {
      out <- rbind(out, read.csv(paste0(l1, j, l2, i, l3),sep=";"))
   }
}
out <- data.frame()
for(i in shp) {
   for(j in "443686") {
      out <- rbind(out, read.csv(paste0(l1, j, l2, i, l3),sep=";"))
   }
}
dat <- out
dat$val <- as.numeric(as.character(dat$val))
dat <- na.omit(dat)
dat$Time <- as.numeric(substr(dat$Aika,19,20))
dat$Day <- as.Date(dat$Aika)

library(ggplot2) 
library(plotly)

plot_ly(dat[dat$Mittari=="Tapausten lukumäärä",], x=~Time, y=~val, color=~Alue, type="scatter", mode="markers&lines") %>% 
   layout(title="Tapausten lukumäärä")

ggplot(dat[dat$Mittari=="Tapausten lukumäärä" & !grepl("SHP",dat$Alue),], aes(x=Time, y=val,colour=Alue))+geom_line()+facet_wrap(~Mittari)

ggplot(dat[dat$Mittari=="Tapausten lukumäärä",], aes(x=Day, y=val,colour=Alue))+geom_line()+facet_wrap(~Mittari)


tmp <- data.frame(value=unlist(aineisto$dataset$value))
tmp$value <- as.numeric(tmp$value)
tmp <- rownames_to_column(tmp)

tmp <- merge(data.frame(rowname=1:prod(aineisto$dataset$dimension$size)),tmp,all=TRUE)

tmp <- matrix(tmp$value,nrow=aineisto$dataset$dimension$size[2], dimnames=list(
unlist(aineisto$dataset$dimension$hcdmunicipality2020$category$label),
unlist(aineisto$dataset$dimension$dateweek2020010120201231$category$label)
))

#puretaan kategoriat paloiksi
 tmp <- aineisto$dataset$dimension$dateweek2020010120201231$category
 label <- data.frame(
   label=unlist(tmp$label),
   index=unlist(tmp$index),
   labelname=unlist(names(tmp$label)),
   indexname=unlist(names(tmp$label))
  )
  
 #Nimetään palaset
 names(label)<-"label"
 names(index)<-"index"
  
 #Laitetana vielä rivinumerot sarakkeiksi, jotta nämä saadaan yhteen.
 label<-rownames_to_column(label)
 index<-rownames_to_column(index)
  
 #Yhdistetään rivinimeä käyttäen
 kategoriat <- index %>% left_join(label,by="rowname")
 
 #otetaan data
 data <- as.data.frame(unlist(aineisto$dataset$value))
 
 #Nimetään
 names(data)<-"Tapauksien lkm"
 data<-rownames_to_column(data)
 data$rowname<-as.numeric(data$rowname)
 
#Yhdistetään muuhun aineistoon
 dataset <- kategoriat %>% left_join(data,by=c("index"="rowname"))

Add a new chunk by clicking the Insert Chunk button on the toolbar or by pressing Ctrl+Alt+I.

When you save the notebook, an HTML file containing the code and output will be saved alongside it (click the Preview button or press Ctrl+Shift+K to preview the HTML file).

The preview shows you a rendered HTML copy of the contents of the editor. Consequently, unlike Knit, Preview does not run any R code chunks. Instead, the output of the chunk when it was last run in the editor is displayed.

<<<<<<< HEAD
LS0tDQp0aXRsZTogIlIgTm90ZWJvb2siDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQpUaGlzIGlzIGFuIFtSIE1hcmtkb3duXShodHRwOi8vcm1hcmtkb3duLnJzdHVkaW8uY29tKSBOb3RlYm9vay4gV2hlbiB5b3UgZXhlY3V0ZSBjb2RlIHdpdGhpbiB0aGUgbm90ZWJvb2ssIHRoZSByZXN1bHRzIGFwcGVhciBiZW5lYXRoIHRoZSBjb2RlLiANCg0KVHJ5IGV4ZWN1dGluZyB0aGlzIGNodW5rIGJ5IGNsaWNraW5nIHRoZSAqUnVuKiBidXR0b24gd2l0aGluIHRoZSBjaHVuayBvciBieSBwbGFjaW5nIHlvdXIgY3Vyc29yIGluc2lkZSBpdCBhbmQgcHJlc3NpbmcgKkN0cmwrU2hpZnQrRW50ZXIqLiANCg0KYGBge3J9DQpsaWJyYXJ5KE9wYXNuZXRVdGlscykNCmxpYnJhcnkocGxvdGx5KQ0KDQojUGFrZXR0aSBkYXRhbiBlZGl0b2ltaXNlZW4gamEgdmlzdWFsaXNvaW50aWluDQogbGlicmFyeSh0aWR5dmVyc2UpDQogDQojUGFrZXR0aSBkYXRhbiBsdWtlbWlzZWVuDQpsaWJyYXJ5KGpzb25saXRlKQ0KbGlicmFyeShyanNvbikNCiANCiNMdWV0YWFuIGFpbmVpc3RvIHNpc8Okw6RuDQphaW5laXN0byA8LSBmcm9tSlNPTigiaHR0cHM6Ly9zYW1wby50aGwuZmkvcGl2b3QvcHJvZC9maS9lcGlyYXBvL2NvdmlkMTljYXNlL2ZhY3RfZXBpcmFwb19jb3ZpZDE5Y2FzZS5qc29uP3Jvdz1kYXRld2VlazIwMjAwMTAxMjAyMDEyMzEtNDQzNjg2JmNvbHVtbj1oY2RtdW5pY2lwYWxpdHkyMDIwLTQ0NTIyMiIpDQoNCmRhdCA8LSByZWFkLmNzdigiaHR0cHM6Ly9zYW1wby50aGwuZmkvcGl2b3QvcHJvZC9maS9lcGlyYXBvL2NvdmlkMTljYXNlL2ZhY3RfZXBpcmFwb19jb3ZpZDE5Y2FzZS5jc3Y/cm93PWRhdGV3ZWVrMjAyMDAxMDEyMDIwMTIzMS00NDM2ODYmcm93PWhjZG11bmljaXBhbGl0eTIwMjAtNDQ1MjIyJmNvbHVtbj1tZWFzdXJlLTE0MTA4MiIsIHNlcD0iOyIpDQoNCmRhdCA8LSByZWFkLmNzdigiaHR0cHM6Ly9zYW1wby50aGwuZmkvcGl2b3QvcHJvZC9maS9lcGlyYXBvL2NvdmlkMTljYXNlL2ZhY3RfZXBpcmFwb19jb3ZpZDE5Y2FzZS5jc3Y/cm93PWRhdGV3ZWVrMjAyMDAxMDEyMDIwMTIzMS00NDM2ODYmcm93PWhjZG11bmljaXBhbGl0eTIwMjAtNDQ1MTMxJmNvbHVtbj1tZWFzdXJlLTE0MTA4MiIsIHNlcD0iOyIpDQoNCm1ldGEgPC0gcmVhZExpbmVzKCJodHRwczovL3NhbXBvLnRobC5maS9waXZvdC9wcm9kL2ZpL2VwaXJhcG8vY292aWQxOWNhc2UvZmFjdF9lcGlyYXBvX2NvdmlkMTljYXNlLmRpbWVuc2lvbnMuanNvbiIpDQoNCiNQYWtldHRpIGRhdGFuIGx1a2VtaXNlZW4NCmxpYnJhcnkoanNvbmxpdGUpDQpsaWJyYXJ5KHJqc29uKQ0KDQpkYXQgPC0ganNvbmxpdGU6OmZyb21KU09OKCJodHRwczovL3BsdXMueWxlLmZpL2xhbWJkYV9zaGVldHMva29yb25hLzIwMjAtMDQtbXVuaWNpcGFsaXRpZXMtaW5mZWN0aW9ucy1jdW11bGF0aXZlL2RhdGEuanNvbiIpDQpkYXQgPC0gYXMuZGF0YS5mcmFtZShkYXQkZGF0YSkNCmRhdCRkYXRlIDwtIGFzLkRhdGUoZGF0JGRhdGUsIGZvcm1hdD0iJWQuJW0uJVkiKQ0KZGF0JGN1bXVsYXRpdmVbZGF0JGN1bXVsYXRpdmU9PSIuLiJdIDwtIDANCmRhdCRjdW11bGF0aXZlIDwtIGFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKGRhdCRjdW11bGF0aXZlKSkNCmRhdCRuZXcgPC0gYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIoZGF0JG5ldykpDQpkYXQkcGVyaHVuZHJlZHRob3VzYW5kIDwtIGFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKGRhdCRwZXJodW5kcmVkdGhvdXNhbmQpKQ0KDQpnZW9qc29uIDwtIHJqc29uOjpmcm9tSlNPTihmaWxlPSJodHRwczovL2dpdGh1Yi5jb20vdGVlbG1vL2dlb2RhdGEvcmF3L21hc3Rlci9nZW9qc29uL0t1bnRhcmFqYXQlMjAyMDE3Lmdlb2pzb24iKQ0KDQpnIDwtIGxpc3QoDQogIGZpdGJvdW5kcyA9ICJnZW9qc29uIiwNCiAgcHJvamVjdGlvbj0iYWxiZXJzIiwNCiAgdmlzaWJsZSA9IEZBTFNFDQopDQoNCiMjIyBLYXJ0dGEgdGFydHV0dGF2aXN0YSAoZWxpIHZpaW1laXN0ZW4gWCBww6RpdsOkbiB0YXBhdWtzaXN0YSkNCg0Kb2JzZXJ2YXRpb25fd2luZG93IDwtIDE0IA0KDQp0bXAgPC0gZGF0W2RhdCRkYXRlPj1tYXgoZGF0JGRhdGUpLW9ic2VydmF0aW9uX3dpbmRvdyxdDQp0bXAgPC0gYWdncmVnYXRlKHRtcCRuZXcsIGJ5PXRtcFtjKCJhcmVhIildLCBGVU49ZnVuY3Rpb24oeCkgc3VtKHgsIG5hLnJtPVRSVUUpKQ0KZmlnIDwtIHBsb3RfbHkoKSAlPiUNCiAgIGFkZF90cmFjZSgNCiAgICB0eXBlPSJjaG9yb3BsZXRoIiwNCiAgICBnZW9qc29uPWdlb2pzb24sDQogICAgbG9jYXRpb25zPXRtcCRhcmVhLA0KICAgIHo9dG1wJHgsDQogICAgem1pbj0wLA0KICAgIHptYXg9MzAsDQogICAgY29sb3JzY2FsZT0iVmlyaWRpcyIsDQogICAgZmVhdHVyZWlka2V5PSJwcm9wZXJ0aWVzLk5hbWUiDQogICkgJT4lDQogIGxheW91dCgNCiAgICBnZW8gPSBnDQogICkNCmZpZw0KDQpwdXNoSW5kaWNhdG9yR3JhcGgoZmlnLCAzOTUpDQoNCmBgYA0KDQpgYGB7cn0NCg0KIyMjIEthcnR0YSBrYWlraXN0YSByYXBvcnRvaWR1aXN0YSB0YXBhdWtzaXN0YQ0KDQp0bXAgPC0gZGF0W2RhdCRkYXRlPT1tYXgoZGF0JGRhdGUpLF0NCmZpZyA8LSBwbG90X2x5KCkgJT4lDQogICBhZGRfdHJhY2UoDQogICAgdHlwZT0iY2hvcm9wbGV0aCIsDQogICAgZ2VvanNvbj1nZW9qc29uLA0KICAgIGxvY2F0aW9ucz10bXAkYXJlYSwNCiAgICB6PXRtcCRjdW11bGF0aXZlLA0KICAgIHptaW49MCwNCiAgICB6bWF4PTUwLA0KICAgIGNvbG9yc2NhbGU9IlZpcmlkaXMiLA0KICAgIGZlYXR1cmVpZGtleT0icHJvcGVydGllcy5OYW1lIg0KICApICU+JQ0KICBsYXlvdXQoDQogICAgZ2VvID0gZw0KICApDQpmaWcNCg0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCg0KdXJsIDwtICdodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vcGxvdGx5L2RhdGFzZXRzL21hc3Rlci9nZW9qc29uLWNvdW50aWVzLWZpcHMuanNvbicNCmNvdW50aWVzIDwtIHJqc29uOjpmcm9tSlNPTihmaWxlPXVybCkNCnVybDI8LSAiaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3Bsb3RseS9kYXRhc2V0cy9tYXN0ZXIvZmlwcy11bmVtcC0xNi5jc3YiDQpkZiA8LSByZWFkLmNzdih1cmwyLCBjb2xDbGFzc2VzPWMoZmlwcz0iY2hhcmFjdGVyIikpDQpnIDwtIGxpc3QoDQogIHNjb3BlID0gJ3VzYScsDQogIHByb2plY3Rpb24gPSBsaXN0KHR5cGUgPSAnYWxiZXJzIHVzYScpLA0KICBzaG93bGFrZXMgPSBUUlVFLA0KICBsYWtlY29sb3IgPSB0b1JHQignd2hpdGUnKQ0KKQ0KZmlnIDwtIHBsb3RfbHkoKQ0KZmlnIDwtIGZpZyAlPiUgYWRkX3RyYWNlKA0KICAgIHR5cGU9ImNob3JvcGxldGgiLA0KICAgIGdlb2pzb249Y291bnRpZXMsDQogICAgbG9jYXRpb25zPWRmJGZpcHMsDQogICAgej1kZiR1bmVtcCwNCiAgICBjb2xvcnNjYWxlPSJWaXJpZGlzIiwNCiAgICB6bWluPTAsDQogICAgem1heD0xMiwNCiAgICBtYXJrZXI9bGlzdChsaW5lPWxpc3QoDQogICAgICB3aWR0aD0wKQ0KICAgICkNCiAgKQ0KZmlnIDwtIGZpZyAlPiUgY29sb3JiYXIodGl0bGUgPSAiVW5lbXBsb3ltZW50IFJhdGUgKCUpIikNCmZpZyA8LSBmaWcgJT4lIGxheW91dCgNCiAgICB0aXRsZSA9ICIyMDE2IFVTIFVuZW1wbG95bWVudCBieSBDb3VudHkiDQopDQoNCmZpZyA8LSBmaWcgJT4lIGxheW91dCgNCiAgICBnZW8gPSBnDQogICkNCg0KZmlnDQoNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCg0Kc2hwIDwtIHN1YnN0cihtZXRhW2dyZXAoIlNIUCIsbWV0YSktMV0sOCwxMykNCmRheSA8LSBzdWJzdHIobWV0YVtncmVwKCc6IndlZWsiJyxtZXRhKS0yXSw4LDEzKQ0KDQpsMSA8LSAiaHR0cHM6Ly9zYW1wby50aGwuZmkvcGl2b3QvcHJvZC9maS9lcGlyYXBvL2NvdmlkMTljYXNlL2ZhY3RfZXBpcmFwb19jb3ZpZDE5Y2FzZS5jc3Y/cm93PWRhdGV3ZWVrMjAyMDAxMDEyMDIwMTIzMS0iDQpsMWogPC0gImh0dHBzOi8vc2FtcG8udGhsLmZpL3Bpdm90L3Byb2QvZmkvZXBpcmFwby9jb3ZpZDE5Y2FzZS9mYWN0X2VwaXJhcG9fY292aWQxOWNhc2UuanNvbj9yb3c9ZGF0ZXdlZWsyMDIwMDEwMTIwMjAxMjMxLSINCmwyIDwtICImcm93PWhjZG11bmljaXBhbGl0eTIwMjAtIg0KbDMgPC0gIiZjb2x1bW49bWVhc3VyZS0xNDEwODIiDQoNCm91dCA8LSBkYXRhLmZyYW1lKCkNCmZvcihpIGluIHNocCkgew0KICAgZm9yKGogaW4gZGF5KSB7DQogICAgICBvdXQgPC0gcmJpbmQob3V0LCByZWFkLmNzdihwYXN0ZTAobDEsIGosIGwyLCBpLCBsMyksc2VwPSI7IikpDQogICB9DQp9DQpvdXQgPC0gZGF0YS5mcmFtZSgpDQpmb3IoaSBpbiBzaHApIHsNCiAgIGZvcihqIGluICI0NDM2ODYiKSB7DQogICAgICBvdXQgPC0gcmJpbmQob3V0LCByZWFkLmNzdihwYXN0ZTAobDEsIGosIGwyLCBpLCBsMyksc2VwPSI7IikpDQogICB9DQp9DQpkYXQgPC0gb3V0DQpkYXQkdmFsIDwtIGFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKGRhdCR2YWwpKQ0KZGF0IDwtIG5hLm9taXQoZGF0KQ0KZGF0JFRpbWUgPC0gYXMubnVtZXJpYyhzdWJzdHIoZGF0JEFpa2EsMTksMjApKQ0KZGF0JERheSA8LSBhcy5EYXRlKGRhdCRBaWthKQ0KDQpsaWJyYXJ5KGdncGxvdDIpIA0KbGlicmFyeShwbG90bHkpDQoNCnBsb3RfbHkoZGF0W2RhdCRNaXR0YXJpPT0iVGFwYXVzdGVuIGx1a3Vtw6TDpHLDpCIsXSwgeD1+VGltZSwgeT1+dmFsLCBjb2xvcj1+QWx1ZSwgdHlwZT0ic2NhdHRlciIsIG1vZGU9Im1hcmtlcnMmbGluZXMiKSAlPiUgDQogICBsYXlvdXQodGl0bGU9IlRhcGF1c3RlbiBsdWt1bcOkw6Ryw6QiKQ0KDQpnZ3Bsb3QoZGF0W2RhdCRNaXR0YXJpPT0iVGFwYXVzdGVuIGx1a3Vtw6TDpHLDpCIgJiAhZ3JlcGwoIlNIUCIsZGF0JEFsdWUpLF0sIGFlcyh4PVRpbWUsIHk9dmFsLGNvbG91cj1BbHVlKSkrZ2VvbV9saW5lKCkrZmFjZXRfd3JhcCh+TWl0dGFyaSkNCg0KZ2dwbG90KGRhdFtkYXQkTWl0dGFyaT09IlRhcGF1c3RlbiBsdWt1bcOkw6Ryw6QiLF0sIGFlcyh4PURheSwgeT12YWwsY29sb3VyPUFsdWUpKStnZW9tX2xpbmUoKStmYWNldF93cmFwKH5NaXR0YXJpKQ0KDQoNCnRtcCA8LSBkYXRhLmZyYW1lKHZhbHVlPXVubGlzdChhaW5laXN0byRkYXRhc2V0JHZhbHVlKSkNCnRtcCR2YWx1ZSA8LSBhcy5udW1lcmljKHRtcCR2YWx1ZSkNCnRtcCA8LSByb3duYW1lc190b19jb2x1bW4odG1wKQ0KDQp0bXAgPC0gbWVyZ2UoZGF0YS5mcmFtZShyb3duYW1lPTE6cHJvZChhaW5laXN0byRkYXRhc2V0JGRpbWVuc2lvbiRzaXplKSksdG1wLGFsbD1UUlVFKQ0KDQp0bXAgPC0gbWF0cml4KHRtcCR2YWx1ZSxucm93PWFpbmVpc3RvJGRhdGFzZXQkZGltZW5zaW9uJHNpemVbMl0sIGRpbW5hbWVzPWxpc3QoDQp1bmxpc3QoYWluZWlzdG8kZGF0YXNldCRkaW1lbnNpb24kaGNkbXVuaWNpcGFsaXR5MjAyMCRjYXRlZ29yeSRsYWJlbCksDQp1bmxpc3QoYWluZWlzdG8kZGF0YXNldCRkaW1lbnNpb24kZGF0ZXdlZWsyMDIwMDEwMTIwMjAxMjMxJGNhdGVnb3J5JGxhYmVsKQ0KKSkNCg0KI3B1cmV0YWFuIGthdGVnb3JpYXQgcGFsb2lrc2kNCiB0bXAgPC0gYWluZWlzdG8kZGF0YXNldCRkaW1lbnNpb24kZGF0ZXdlZWsyMDIwMDEwMTIwMjAxMjMxJGNhdGVnb3J5DQogbGFiZWwgPC0gZGF0YS5mcmFtZSgNCiAgIGxhYmVsPXVubGlzdCh0bXAkbGFiZWwpLA0KICAgaW5kZXg9dW5saXN0KHRtcCRpbmRleCksDQogICBsYWJlbG5hbWU9dW5saXN0KG5hbWVzKHRtcCRsYWJlbCkpLA0KICAgaW5kZXhuYW1lPXVubGlzdChuYW1lcyh0bXAkbGFiZWwpKQ0KICApDQogIA0KICNOaW1ldMOkw6RuIHBhbGFzZXQNCiBuYW1lcyhsYWJlbCk8LSJsYWJlbCINCiBuYW1lcyhpbmRleCk8LSJpbmRleCINCiAgDQogI0xhaXRldGFuYSB2aWVsw6Qgcml2aW51bWVyb3Qgc2FyYWtrZWlrc2ksIGpvdHRhIG7DpG3DpCBzYWFkYWFuIHlodGVlbi4NCiBsYWJlbDwtcm93bmFtZXNfdG9fY29sdW1uKGxhYmVsKQ0KIGluZGV4PC1yb3duYW1lc190b19jb2x1bW4oaW5kZXgpDQogIA0KICNZaGRpc3RldMOkw6RuIHJpdmluaW1lw6Qga8OkeXR0w6Rlbg0KIGthdGVnb3JpYXQgPC0gaW5kZXggJT4lIGxlZnRfam9pbihsYWJlbCxieT0icm93bmFtZSIpDQogDQogI290ZXRhYW4gZGF0YQ0KIGRhdGEgPC0gYXMuZGF0YS5mcmFtZSh1bmxpc3QoYWluZWlzdG8kZGF0YXNldCR2YWx1ZSkpDQogDQogI05pbWV0w6TDpG4NCiBuYW1lcyhkYXRhKTwtIlRhcGF1a3NpZW4gbGttIg0KIGRhdGE8LXJvd25hbWVzX3RvX2NvbHVtbihkYXRhKQ0KIGRhdGEkcm93bmFtZTwtYXMubnVtZXJpYyhkYXRhJHJvd25hbWUpDQogDQojWWhkaXN0ZXTDpMOkbiBtdXVodW4gYWluZWlzdG9vbg0KIGRhdGFzZXQgPC0ga2F0ZWdvcmlhdCAlPiUgbGVmdF9qb2luKGRhdGEsYnk9YygiaW5kZXgiPSJyb3duYW1lIikpDQpgYGANCg0KQWRkIGEgbmV3IGNodW5rIGJ5IGNsaWNraW5nIHRoZSAqSW5zZXJ0IENodW5rKiBidXR0b24gb24gdGhlIHRvb2xiYXIgb3IgYnkgcHJlc3NpbmcgKkN0cmwrQWx0K0kqLg0KDQpXaGVuIHlvdSBzYXZlIHRoZSBub3RlYm9vaywgYW4gSFRNTCBmaWxlIGNvbnRhaW5pbmcgdGhlIGNvZGUgYW5kIG91dHB1dCB3aWxsIGJlIHNhdmVkIGFsb25nc2lkZSBpdCAoY2xpY2sgdGhlICpQcmV2aWV3KiBidXR0b24gb3IgcHJlc3MgKkN0cmwrU2hpZnQrSyogdG8gcHJldmlldyB0aGUgSFRNTCBmaWxlKS4NCg0KVGhlIHByZXZpZXcgc2hvd3MgeW91IGEgcmVuZGVyZWQgSFRNTCBjb3B5IG9mIHRoZSBjb250ZW50cyBvZiB0aGUgZWRpdG9yLiBDb25zZXF1ZW50bHksIHVubGlrZSAqS25pdCosICpQcmV2aWV3KiBkb2VzIG5vdCBydW4gYW55IFIgY29kZSBjaHVua3MuIEluc3RlYWQsIHRoZSBvdXRwdXQgb2YgdGhlIGNodW5rIHdoZW4gaXQgd2FzIGxhc3QgcnVuIGluIHRoZSBlZGl0b3IgaXMgZGlzcGxheWVkLg0K
=======
LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKVGhpcyBpcyBhbiBbUiBNYXJrZG93bl0oaHR0cDovL3JtYXJrZG93bi5yc3R1ZGlvLmNvbSkgTm90ZWJvb2suIFdoZW4geW91IGV4ZWN1dGUgY29kZSB3aXRoaW4gdGhlIG5vdGVib29rLCB0aGUgcmVzdWx0cyBhcHBlYXIgYmVuZWF0aCB0aGUgY29kZS4gCgpUcnkgZXhlY3V0aW5nIHRoaXMgY2h1bmsgYnkgY2xpY2tpbmcgdGhlICpSdW4qIGJ1dHRvbiB3aXRoaW4gdGhlIGNodW5rIG9yIGJ5IHBsYWNpbmcgeW91ciBjdXJzb3IgaW5zaWRlIGl0IGFuZCBwcmVzc2luZyAqQ3RybCtTaGlmdCtFbnRlciouIAoKYGBge3J9CmxpYnJhcnkoT3Bhc25ldFV0aWxzKQpsaWJyYXJ5KHBsb3RseSkKCiNQYWtldHRpIGRhdGFuIGVkaXRvaW1pc2VlbiBqYSB2aXN1YWxpc29pbnRpaW4KIGxpYnJhcnkodGlkeXZlcnNlKQogCiNQYWtldHRpIGRhdGFuIGx1a2VtaXNlZW4KbGlicmFyeShqc29ubGl0ZSkKbGlicmFyeShyanNvbikKIAojTHVldGFhbiBhaW5laXN0byBzaXPDpMOkbgphaW5laXN0byA8LSBmcm9tSlNPTigiaHR0cHM6Ly9zYW1wby50aGwuZmkvcGl2b3QvcHJvZC9maS9lcGlyYXBvL2NvdmlkMTljYXNlL2ZhY3RfZXBpcmFwb19jb3ZpZDE5Y2FzZS5qc29uP3Jvdz1kYXRld2VlazIwMjAwMTAxMjAyMDEyMzEtNDQzNjg2JmNvbHVtbj1oY2RtdW5pY2lwYWxpdHkyMDIwLTQ0NTIyMiIpCgpkYXQgPC0gcmVhZC5jc3YoImh0dHBzOi8vc2FtcG8udGhsLmZpL3Bpdm90L3Byb2QvZmkvZXBpcmFwby9jb3ZpZDE5Y2FzZS9mYWN0X2VwaXJhcG9fY292aWQxOWNhc2UuY3N2P3Jvdz1kYXRld2VlazIwMjAwMTAxMjAyMDEyMzEtNDQzNjg2JnJvdz1oY2RtdW5pY2lwYWxpdHkyMDIwLTQ0NTIyMiZjb2x1bW49bWVhc3VyZS0xNDEwODIiLCBzZXA9IjsiKQoKZGF0IDwtIHJlYWQuY3N2KCJodHRwczovL3NhbXBvLnRobC5maS9waXZvdC9wcm9kL2ZpL2VwaXJhcG8vY292aWQxOWNhc2UvZmFjdF9lcGlyYXBvX2NvdmlkMTljYXNlLmNzdj9yb3c9ZGF0ZXdlZWsyMDIwMDEwMTIwMjAxMjMxLTQ0MzY4NiZyb3c9aGNkbXVuaWNpcGFsaXR5MjAyMC00NDUxMzEmY29sdW1uPW1lYXN1cmUtMTQxMDgyIiwgc2VwPSI7IikKCm1ldGEgPC0gcmVhZExpbmVzKCJodHRwczovL3NhbXBvLnRobC5maS9waXZvdC9wcm9kL2ZpL2VwaXJhcG8vY292aWQxOWNhc2UvZmFjdF9lcGlyYXBvX2NvdmlkMTljYXNlLmRpbWVuc2lvbnMuanNvbiIpCgojUGFrZXR0aSBkYXRhbiBsdWtlbWlzZWVuCmxpYnJhcnkoanNvbmxpdGUpCmxpYnJhcnkocmpzb24pCgpkYXQgPC0ganNvbmxpdGU6OmZyb21KU09OKCJodHRwczovL3BsdXMueWxlLmZpL2xhbWJkYV9zaGVldHMva29yb25hLzIwMjAtMDQtbXVuaWNpcGFsaXRpZXMtaW5mZWN0aW9ucy1jdW11bGF0aXZlL2RhdGEuanNvbiIpCmRhdCA8LSBhcy5kYXRhLmZyYW1lKGRhdCRkYXRhKQpkYXQkZGF0ZSA8LSBhcy5EYXRlKGRhdCRkYXRlLCBmb3JtYXQ9IiVkLiVtLiVZIikKZGF0JGN1bXVsYXRpdmVbZGF0JGN1bXVsYXRpdmU9PSIuLiJdIDwtIDAKZGF0JGN1bXVsYXRpdmUgPC0gYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIoZGF0JGN1bXVsYXRpdmUpKQpkYXQkbmV3IDwtIGFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKGRhdCRuZXcpKQpkYXQkcGVyaHVuZHJlZHRob3VzYW5kIDwtIGFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKGRhdCRwZXJodW5kcmVkdGhvdXNhbmQpKQoKZ2VvanNvbiA8LSByanNvbjo6ZnJvbUpTT04oZmlsZT0iaHR0cHM6Ly9naXRodWIuY29tL3RlZWxtby9nZW9kYXRhL3Jhdy9tYXN0ZXIvZ2VvanNvbi9LdW50YXJhamF0JTIwMjAxNy5nZW9qc29uIikKCmcgPC0gbGlzdCgKICBmaXRib3VuZHMgPSAiZ2VvanNvbiIsCiAgcHJvamVjdGlvbj0iYWxiZXJzIiwKICB2aXNpYmxlID0gRkFMU0UKKQoKIyMjIEthcnR0YSBrYWlraXN0YSByYXBvcnRvaWR1aXN0YSB0YXBhdWtzaXN0YQoKdG1wIDwtIGRhdFtkYXQkZGF0ZT09bWF4KGRhdCRkYXRlKSxdCmZpZyA8LSBwbG90X2x5KCkgJT4lCiAgIGFkZF90cmFjZSgKICAgIHR5cGU9ImNob3JvcGxldGgiLAogICAgZ2VvanNvbj1nZW9qc29uLAogICAgbG9jYXRpb25zPXRtcCRhcmVhLAogICAgej10bXAkY3VtdWxhdGl2ZSwKICAgIHptaW49MCwKICAgIHptYXg9NTAsCiAgICBjb2xvcnNjYWxlPSJWaXJpZGlzIiwKICAgIGZlYXR1cmVpZGtleT0icHJvcGVydGllcy5OYW1lIgogICkgJT4lCiAgbGF5b3V0KAogICAgZ2VvID0gZwogICkKZmlnCgpwdXNoSW5kaWNhdG9yR3JhcGgoZmlnLCAzOTUpCgojIyMgS2FydHRhIHRhcnR1dHRhdmlzdGEgKGVsaSB2aWltZWlzdGVuIDIwIHDDpGl2w6RuIHRhcGF1a3Npc3RhKQoKdG1wIDwtIGRhdFtkYXQkZGF0ZT49bWF4KGRhdCRkYXRlKS0yMCxdCnRtcCA8LSBhZ2dyZWdhdGUodG1wJG5ldywgYnk9dG1wW2MoImFyZWEiKV0sIEZVTj1mdW5jdGlvbih4KSBzdW0oeCwgbmEucm09VFJVRSkpCmZpZyA8LSBwbG90X2x5KCkgJT4lCiAgIGFkZF90cmFjZSgKICAgIHR5cGU9ImNob3JvcGxldGgiLAogICAgZ2VvanNvbj1nZW9qc29uLAogICAgbG9jYXRpb25zPXRtcCRhcmVhLAogICAgej10bXAkeCwKICAgIHptaW49MCwKICAgIHptYXg9MzAsCiAgICBjb2xvcnNjYWxlPSJWaXJpZGlzIiwKICAgIGZlYXR1cmVpZGtleT0icHJvcGVydGllcy5OYW1lIgogICkgJT4lCiAgbGF5b3V0KAogICAgZ2VvID0gZwogICkKZmlnCgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKdXJsIDwtICdodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vcGxvdGx5L2RhdGFzZXRzL21hc3Rlci9nZW9qc29uLWNvdW50aWVzLWZpcHMuanNvbicKY291bnRpZXMgPC0gcmpzb246OmZyb21KU09OKGZpbGU9dXJsKQp1cmwyPC0gImh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9wbG90bHkvZGF0YXNldHMvbWFzdGVyL2ZpcHMtdW5lbXAtMTYuY3N2IgpkZiA8LSByZWFkLmNzdih1cmwyLCBjb2xDbGFzc2VzPWMoZmlwcz0iY2hhcmFjdGVyIikpCmcgPC0gbGlzdCgKICBzY29wZSA9ICd1c2EnLAogIHByb2plY3Rpb24gPSBsaXN0KHR5cGUgPSAnYWxiZXJzIHVzYScpLAogIHNob3dsYWtlcyA9IFRSVUUsCiAgbGFrZWNvbG9yID0gdG9SR0IoJ3doaXRlJykKKQpmaWcgPC0gcGxvdF9seSgpCmZpZyA8LSBmaWcgJT4lIGFkZF90cmFjZSgKICAgIHR5cGU9ImNob3JvcGxldGgiLAogICAgZ2VvanNvbj1jb3VudGllcywKICAgIGxvY2F0aW9ucz1kZiRmaXBzLAogICAgej1kZiR1bmVtcCwKICAgIGNvbG9yc2NhbGU9IlZpcmlkaXMiLAogICAgem1pbj0wLAogICAgem1heD0xMiwKICAgIG1hcmtlcj1saXN0KGxpbmU9bGlzdCgKICAgICAgd2lkdGg9MCkKICAgICkKICApCmZpZyA8LSBmaWcgJT4lIGNvbG9yYmFyKHRpdGxlID0gIlVuZW1wbG95bWVudCBSYXRlICglKSIpCmZpZyA8LSBmaWcgJT4lIGxheW91dCgKICAgIHRpdGxlID0gIjIwMTYgVVMgVW5lbXBsb3ltZW50IGJ5IENvdW50eSIKKQoKZmlnIDwtIGZpZyAlPiUgbGF5b3V0KAogICAgZ2VvID0gZwogICkKCmZpZwoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKc2hwIDwtIHN1YnN0cihtZXRhW2dyZXAoIlNIUCIsbWV0YSktMV0sOCwxMykKZGF5IDwtIHN1YnN0cihtZXRhW2dyZXAoJzoid2VlayInLG1ldGEpLTJdLDgsMTMpCgpsMSA8LSAiaHR0cHM6Ly9zYW1wby50aGwuZmkvcGl2b3QvcHJvZC9maS9lcGlyYXBvL2NvdmlkMTljYXNlL2ZhY3RfZXBpcmFwb19jb3ZpZDE5Y2FzZS5jc3Y/cm93PWRhdGV3ZWVrMjAyMDAxMDEyMDIwMTIzMS0iCmwxaiA8LSAiaHR0cHM6Ly9zYW1wby50aGwuZmkvcGl2b3QvcHJvZC9maS9lcGlyYXBvL2NvdmlkMTljYXNlL2ZhY3RfZXBpcmFwb19jb3ZpZDE5Y2FzZS5qc29uP3Jvdz1kYXRld2VlazIwMjAwMTAxMjAyMDEyMzEtIgpsMiA8LSAiJnJvdz1oY2RtdW5pY2lwYWxpdHkyMDIwLSIKbDMgPC0gIiZjb2x1bW49bWVhc3VyZS0xNDEwODIiCgpvdXQgPC0gZGF0YS5mcmFtZSgpCmZvcihpIGluIHNocCkgewogICBmb3IoaiBpbiBkYXkpIHsKICAgICAgb3V0IDwtIHJiaW5kKG91dCwgcmVhZC5jc3YocGFzdGUwKGwxLCBqLCBsMiwgaSwgbDMpLHNlcD0iOyIpKQogICB9Cn0Kb3V0IDwtIGRhdGEuZnJhbWUoKQpmb3IoaSBpbiBzaHApIHsKICAgZm9yKGogaW4gIjQ0MzY4NiIpIHsKICAgICAgb3V0IDwtIHJiaW5kKG91dCwgcmVhZC5jc3YocGFzdGUwKGwxLCBqLCBsMiwgaSwgbDMpLHNlcD0iOyIpKQogICB9Cn0KZGF0IDwtIG91dApkYXQkdmFsIDwtIGFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKGRhdCR2YWwpKQpkYXQgPC0gbmEub21pdChkYXQpCmRhdCRUaW1lIDwtIGFzLm51bWVyaWMoc3Vic3RyKGRhdCRBaWthLDE5LDIwKSkKZGF0JERheSA8LSBhcy5EYXRlKGRhdCRBaWthKQoKbGlicmFyeShnZ3Bsb3QyKSAKbGlicmFyeShwbG90bHkpCgpwbG90X2x5KGRhdFtkYXQkTWl0dGFyaT09IlRhcGF1c3RlbiBsdWt1bcOkw6Ryw6QiLF0sIHg9flRpbWUsIHk9fnZhbCwgY29sb3I9fkFsdWUsIHR5cGU9InNjYXR0ZXIiLCBtb2RlPSJtYXJrZXJzJmxpbmVzIikgJT4lIAogICBsYXlvdXQodGl0bGU9IlRhcGF1c3RlbiBsdWt1bcOkw6Ryw6QiKQoKZ2dwbG90KGRhdFtkYXQkTWl0dGFyaT09IlRhcGF1c3RlbiBsdWt1bcOkw6Ryw6QiICYgIWdyZXBsKCJTSFAiLGRhdCRBbHVlKSxdLCBhZXMoeD1UaW1lLCB5PXZhbCxjb2xvdXI9QWx1ZSkpK2dlb21fbGluZSgpK2ZhY2V0X3dyYXAofk1pdHRhcmkpCgpnZ3Bsb3QoZGF0W2RhdCRNaXR0YXJpPT0iVGFwYXVzdGVuIGx1a3Vtw6TDpHLDpCIsXSwgYWVzKHg9RGF5LCB5PXZhbCxjb2xvdXI9QWx1ZSkpK2dlb21fbGluZSgpK2ZhY2V0X3dyYXAofk1pdHRhcmkpCgoKdG1wIDwtIGRhdGEuZnJhbWUodmFsdWU9dW5saXN0KGFpbmVpc3RvJGRhdGFzZXQkdmFsdWUpKQp0bXAkdmFsdWUgPC0gYXMubnVtZXJpYyh0bXAkdmFsdWUpCnRtcCA8LSByb3duYW1lc190b19jb2x1bW4odG1wKQoKdG1wIDwtIG1lcmdlKGRhdGEuZnJhbWUocm93bmFtZT0xOnByb2QoYWluZWlzdG8kZGF0YXNldCRkaW1lbnNpb24kc2l6ZSkpLHRtcCxhbGw9VFJVRSkKCnRtcCA8LSBtYXRyaXgodG1wJHZhbHVlLG5yb3c9YWluZWlzdG8kZGF0YXNldCRkaW1lbnNpb24kc2l6ZVsyXSwgZGltbmFtZXM9bGlzdCgKdW5saXN0KGFpbmVpc3RvJGRhdGFzZXQkZGltZW5zaW9uJGhjZG11bmljaXBhbGl0eTIwMjAkY2F0ZWdvcnkkbGFiZWwpLAp1bmxpc3QoYWluZWlzdG8kZGF0YXNldCRkaW1lbnNpb24kZGF0ZXdlZWsyMDIwMDEwMTIwMjAxMjMxJGNhdGVnb3J5JGxhYmVsKQopKQoKI3B1cmV0YWFuIGthdGVnb3JpYXQgcGFsb2lrc2kKIHRtcCA8LSBhaW5laXN0byRkYXRhc2V0JGRpbWVuc2lvbiRkYXRld2VlazIwMjAwMTAxMjAyMDEyMzEkY2F0ZWdvcnkKIGxhYmVsIDwtIGRhdGEuZnJhbWUoCiAgIGxhYmVsPXVubGlzdCh0bXAkbGFiZWwpLAogICBpbmRleD11bmxpc3QodG1wJGluZGV4KSwKICAgbGFiZWxuYW1lPXVubGlzdChuYW1lcyh0bXAkbGFiZWwpKSwKICAgaW5kZXhuYW1lPXVubGlzdChuYW1lcyh0bXAkbGFiZWwpKQogICkKICAKICNOaW1ldMOkw6RuIHBhbGFzZXQKIG5hbWVzKGxhYmVsKTwtImxhYmVsIgogbmFtZXMoaW5kZXgpPC0iaW5kZXgiCiAgCiAjTGFpdGV0YW5hIHZpZWzDpCByaXZpbnVtZXJvdCBzYXJha2tlaWtzaSwgam90dGEgbsOkbcOkIHNhYWRhYW4geWh0ZWVuLgogbGFiZWw8LXJvd25hbWVzX3RvX2NvbHVtbihsYWJlbCkKIGluZGV4PC1yb3duYW1lc190b19jb2x1bW4oaW5kZXgpCiAgCiAjWWhkaXN0ZXTDpMOkbiByaXZpbmltZcOkIGvDpHl0dMOkZW4KIGthdGVnb3JpYXQgPC0gaW5kZXggJT4lIGxlZnRfam9pbihsYWJlbCxieT0icm93bmFtZSIpCiAKICNvdGV0YWFuIGRhdGEKIGRhdGEgPC0gYXMuZGF0YS5mcmFtZSh1bmxpc3QoYWluZWlzdG8kZGF0YXNldCR2YWx1ZSkpCiAKICNOaW1ldMOkw6RuCiBuYW1lcyhkYXRhKTwtIlRhcGF1a3NpZW4gbGttIgogZGF0YTwtcm93bmFtZXNfdG9fY29sdW1uKGRhdGEpCiBkYXRhJHJvd25hbWU8LWFzLm51bWVyaWMoZGF0YSRyb3duYW1lKQogCiNZaGRpc3RldMOkw6RuIG11dWh1biBhaW5laXN0b29uCiBkYXRhc2V0IDwtIGthdGVnb3JpYXQgJT4lIGxlZnRfam9pbihkYXRhLGJ5PWMoImluZGV4Ij0icm93bmFtZSIpKQpgYGAKCkFkZCBhIG5ldyBjaHVuayBieSBjbGlja2luZyB0aGUgKkluc2VydCBDaHVuayogYnV0dG9uIG9uIHRoZSB0b29sYmFyIG9yIGJ5IHByZXNzaW5nICpDdHJsK0FsdCtJKi4KCldoZW4geW91IHNhdmUgdGhlIG5vdGVib29rLCBhbiBIVE1MIGZpbGUgY29udGFpbmluZyB0aGUgY29kZSBhbmQgb3V0cHV0IHdpbGwgYmUgc2F2ZWQgYWxvbmdzaWRlIGl0IChjbGljayB0aGUgKlByZXZpZXcqIGJ1dHRvbiBvciBwcmVzcyAqQ3RybCtTaGlmdCtLKiB0byBwcmV2aWV3IHRoZSBIVE1MIGZpbGUpLgoKVGhlIHByZXZpZXcgc2hvd3MgeW91IGEgcmVuZGVyZWQgSFRNTCBjb3B5IG9mIHRoZSBjb250ZW50cyBvZiB0aGUgZWRpdG9yLiBDb25zZXF1ZW50bHksIHVubGlrZSAqS25pdCosICpQcmV2aWV3KiBkb2VzIG5vdCBydW4gYW55IFIgY29kZSBjaHVua3MuIEluc3RlYWQsIHRoZSBvdXRwdXQgb2YgdGhlIGNodW5rIHdoZW4gaXQgd2FzIGxhc3QgcnVuIGluIHRoZSBlZGl0b3IgaXMgZGlzcGxheWVkLgo=
>>>>>>> b4e35ca95f79ed74fb448ccd1682fc683b84c0d2